package top.jiangqiang.qianyi.common.storage;

import top.jiangqiang.qianyi.common.storage.base.BaseStorageConfig;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.function.Consumer;

/**
 * @Date 2024/7/5 下午5:12
 * @Author Jiangqiang
 */
public interface StorageService {
    /**
     * 生成全局唯一的key
     *
     * @param originalFilename 原始文件名
     * @return fileKey 不应该以/开头
     */
    String generateFileKey(String originalFilename);

    /**
     * @param originalFilename 原始文件名
     * @param inputStream      文件流
     * @param progressCallback 进度
     * @return fileKey
     */
    String upload(String originalFilename, InputStream inputStream, Consumer<ProgressContext> progressCallback);

    /**
     * @param fileKey      根据指定的fileKey下载文件
     * @param outputStream 下载到指定输出流
     */
    void download(String fileKey, OutputStream outputStream);

    /**
     * @param fileKey 根据指定的fileKey下载文件
     * @return 下载到字节数组
     */
    byte[] download(String fileKey);

    /**
     * 获取上传到当前存储器后的文件访问链接
     *
     * @param fileKey 全局唯一的key
     */
    String getUrl(String fileKey);

    /**
     * 删除文件
     *
     * @param fileKey 全局唯一的key
     * @return
     */
    boolean delete(String fileKey);

    /**
     * @return 测试存储器是否可用
     */
    boolean test();

    /**
     * @return 获取存储器配置
     */
    BaseStorageConfig getStorageConfig();

    /**
     * 销毁时清理资源
     */
    void cleanup();
}
